﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Data.SqlClient;
using System.Reflection;

namespace AgendaManager.Service
{
    public class FotoDAO : DAOBase
    {
        public static Foto NuevaFoto(Foto foto)
        {
            try
            {
                int fotoId = GetNextId(foto);

                if (fotoId != 0)
                {
                    foto.Id = fotoId;
                    if (CreateFotoEntity(foto))
                        return foto;

                    throw new Exception("No se pudo crear la Foto");
                }
                else
                    throw new Exception("No se pudo obtener el siguiente id de la entidad: Foto");
            }
            catch (Exception)
            {

                throw;
            }
        }

        private static bool CreateFotoEntity(Foto foto)
        {
            if (foto == null)
                return false;

            try
            {
                using (SqlConnection con = new SqlConnection(connStr))
                {
                    using (SqlCommand cmd = new SqlCommand())
                    {
                        cmd.Connection = con;

                        con.Open();

                        var props = foto.GetType().GetProperties();
                        foreach (PropertyInfo prop in props)
                        {
                            if (prop.Name != "CantFotos")
                            {
                                SqlParameter p = cmd.CreateParameter();

                                if (prop.PropertyType.IsGenericType && prop.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>))
                                {
                                    p.SqlDbType = DAOBase.ConvertToDBType(prop.PropertyType.GetGenericArguments()[0]);
                                    if (prop.GetValue(foto, null) == null)
                                        p.SqlValue = Convert.DBNull;
                                    else
                                        p.SqlValue = prop.GetValue(foto, null);
                                }
                                else
                                {
                                    p.SqlDbType = DAOBase.ConvertToDBType(prop);
                                    p.SqlValue = prop.GetValue(foto, null);
                                }

                                p.ParameterName = "@" + prop.Name;

                                cmd.Parameters.Add(p);
                            }
                        }
                        //cmd.Parameters.A

                        CrearInsertFotoQuery(cmd, foto.GetType().Name, foto);


                        int result = (int)cmd.ExecuteNonQuery();

                        if (result > 0)
                            return true;

                        return false;
                    }
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        internal static List<Foto> RetrieveEntitiesWhere(object dto, string where)
        {
            List<Foto> dtos = new List<Foto>();

            DataTable dt = GetDataTableWhere(dto, where);

            if (dt.Rows.Count > 0)
                dtos = LlenarFotos(dto, dt);

            return dtos;
        }

        private static List<Foto> LlenarFotos(object dto, DataTable dt)
        {
            try
            {
                List<Foto> dtos = new List<Foto>();

                foreach (DataRow dr in dt.Rows)
                {
                    Foto aux = new Foto();
                    PoblarObjetoDesdeDataRow(aux, dr);

                    dtos.Add(aux);
                }

                return dtos;
            }
            catch (Exception)
            {
                throw;
            }
        }

        internal static List<Foto> GetEntitiesPaginated(object dto, int num, string filtro)
        {
            try
            {
                List<Foto> dtos = new List<Foto>();

                DataTable dt = GetDataTablePaginado(dto, num, filtro);

                if (dt.Rows.Count > 0)
                    dtos = LlenarFotos(dto, dt);

                return dtos;
            }
            catch (Exception)
            {
                throw;
            }
            
        }

        
    }
}